package com.realtyManage.springboot.Config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.realtyManage.springboot.Utils.HttpClient;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * Wxacode
 *
 * @Author 杭州素色网络科技有限公司
 * @Date 2019/7/4
 * 短信发送
 **/
public class Wxacode {
    public static void main(String[] args)  {
        Wxacode a=new Wxacode();
        a.getWxacode("wx9e8f4411d8b0eb90","a7fbbe3a6fe044148bfbb27eba4e429c","userId=1");
    }

    public static String getWxacode(String appid, String secret, String customScene){
        String getWxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";
        HttpClient httpClient = new HttpClient();
        // 封装参数，这里是HashMap
        Map<String, Object> paramsGet = new HashMap<String, Object>();
        paramsGet.put("grant_type", "client_credential");
        paramsGet.put("appid", appid);
        paramsGet.put("secret", secret);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        String response = httpClient.sendGetRequest(getWxTokenUrl,paramsGet,headers);
        String access_token = JSONObject.parseObject(response).getString("access_token");

        String scene = customScene;//页面参数，最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode处理，请使用其他编码方式）
        String page = "";//页面路径，必须是已经发布的小程序存在的页面（否则报错），例如 pages/index/index, 根路径前不要填加 /,不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
        String width = "280";//二维码的宽度，单位 px，最小 280px，最大 1280px
        HashMap<String, String> paramsPost = new HashMap<>();
        paramsPost.put("scene", scene);
        paramsPost.put("page", page);
        paramsPost.put("width", width);
        JSONObject paramsJSONObj = JSONObject.parseObject(JSON.toJSONString(paramsPost));
        String postURI = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token;
        return wxPost(postURI,paramsJSONObj,String.valueOf(System.currentTimeMillis()));
    }

    public static String wxPost(String uri, JSONObject paramJson, String fileName) {
        String result = "";
        try {
            URL url = new URL(uri);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            printWriter.write(paramJson.toString());
            // flush输出流的缓冲
            printWriter.flush();
            // 开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            byte[] data = null;
            ByteArrayOutputStream os = new ByteArrayOutputStream();//此处为字节流
            //OutputStream os = new FileOutputStream(new File("D:/" + fileName + ".jpg"));//文件流
            int len;
            byte[] arr = new byte[1024];
            while ((len = bis.read(arr)) != -1) {
                os.write(arr, 0, len);
                os.flush();
            }
            data = os.toByteArray();
            // 将获取流转为base64格式
            result = new String(Base64.getEncoder().encode(data));
            os.close();
            bis.close();
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常！"+e);
            e.printStackTrace();
        }
        return result;
    }


    //兑换商品界面
    public static String getCommodityWxCode(String appid, String secret, String scenes, String imageRootPath, String realPath){
        String getWxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";
        HttpClient httpClient = new HttpClient();
        // 封装参数，这里是HashMap
        Map<String, Object> paramsGet = new HashMap<String, Object>();
        paramsGet.put("grant_type", "client_credential");
        paramsGet.put("appid", appid);
        paramsGet.put("secret", secret);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        String response = httpClient.sendGetRequest(getWxTokenUrl,paramsGet,headers);
        String access_token = JSONObject.parseObject(response).getString("access_token");

        String scene = scenes;//页面参数，最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode处理，请使用其他编码方式）
        String page = "";//页面路径，必须是已经发布的小程序存在的页面（否则报错），例如 pages/index/index, 根路径前不要填加 /,不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
        String width = "280";//二维码的宽度，单位 px，最小 280px，最大 1280px
        HashMap<String, String> paramsPost = new HashMap<>();
        paramsPost.put("scene", scene);
        paramsPost.put("page", page);
        paramsPost.put("width", width);
        JSONObject paramsJSONObj = JSONObject.parseObject(JSON.toJSONString(paramsPost));
        String postURI = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token;
        return wxsPost(postURI,paramsJSONObj,String.valueOf(System.currentTimeMillis()),imageRootPath, realPath);
    }

    public static String wxsPost(String uri, JSONObject paramJson, String fileName, String imageRootPath, String realPath) {
        String result = "";
        try {
            URL url = new URL(uri);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            printWriter.write(paramJson.toString());
            // flush输出流的缓冲
            printWriter.flush();
            // 开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            byte[] data = null;
            //ByteArrayOutputStream os = new ByteArrayOutputStream();//此处为字节流
            OutputStream os = new FileOutputStream(new File(imageRootPath + fileName + ".jpg"));//文件流
            int len;
            byte[] arr = new byte[1024];
            while ((len = bis.read(arr)) != -1) {
                os.write(arr, 0, len);
                os.flush();
            }
            //data = os.toByteArray();
            // 将获取流转为base64格式
            //result = new String(Base64.getEncoder().encode(data));
            os.close();
            bis.close();
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常！"+e);
            e.printStackTrace();
        }
        return realPath + fileName + ".jpg";
    }

}
